package com.winsdom.service.customer.impl;

import com.winsdom.entity.customer.CustomerPersonalCreateRequest;
import com.winsdom.mapper.customer.CustomerPersonalCreateMapper;
import com.winsdom.service.customer.CustomerPersonalCreateService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Set;
import java.util.LinkedHashSet;

/**
 * 个人客户创建服务实现类
 * <p>
 * 负责处理个人客户的完整创建流程，包括：
 * 1. 客户主表数据插入
 * 2. 个人扩展信息（证件类型、证件号码等）插入
 * 3. 证件图片信息管理
 * 4. 联系人及楼盘关联关系处理
 * <p>
 * 所有操作在一个事务中执行，确保数据一致性。
 * 使用LinkedHashSet处理楼盘名称去重，保持用户输入顺序。
 */
@Service
@Transactional
public class CustomerPersonalCreateServiceImpl implements CustomerPersonalCreateService {
    @Resource
    private CustomerPersonalCreateMapper mapper;

    /**
     * 创建个人客户的完整业务流程
     * <p>
     * 执行顺序：
     * 1. 插入客户主表数据并获取自增ID
     * 2. 插入个人扩展信息（如证件类型、证件号码）
     * 3. 插入证件图片路径（如果提供）
     * 4. 处理联系人及其关联的楼盘信息
     *
     * @param request 个人客户创建请求，包含完整的客户信息
     * @return 新创建的客户ID
     */
    @Override
    public Long create(CustomerPersonalCreateRequest request) {
        // 1. 插入客户主表（基础信息）
        // 通过MyBatis的selectKey机制自动回填生成的customerId
        mapper.insertCustomerMain(request);
        Long customerId = request.getCustomerId();

        // 2. 插入个人扩展信息（证件类型、证件号码等）
        // 仅当至少一个字段有值时执行插入
        if (request.getIdType() != null || request.getIdNumber() != null) {
            mapper.insertPersonalInfo(customerId, request);
        }

        // 3. 插入证件图片信息（如果提供了图片路径）
        if (request.getIdImagePath() != null) {
            mapper.insertIdImage(customerId, request.getIdImagePath());
        }

        // 4. 处理联系人及关联的楼盘信息（支持多联系人，每个联系人关联多个楼盘）
        processContacts(customerId, request);

        return customerId;
    }

    /**
     * 处理联系人及关联的楼盘信息
     * <p>
     * 逻辑说明：
     * 1. 遍历所有联系人，插入联系人基本信息
     * 2. 获取联系人ID后，对关联的楼盘名称进行去重处理
     * 3. 根据楼盘名称查询分类ID，建立联系人与楼盘分类的关联
     *
     * @param customerId 客户ID
     * @param request    包含联系人信息的创建请求
     */
    private void processContacts(Long customerId, CustomerPersonalCreateRequest request) {
        if (request.getContactInfos() != null) {
            for (CustomerPersonalCreateRequest.ContactInfo contact : request.getContactInfos()) {
                // 插入联系人基本信息（姓名、电话、邮箱等）
                mapper.insertContact(customerId, contact);
                // 通过selectKey获取数据库生成的联系人ID
                Long contactId = contact.getContactId();

                // 对联系人关联的楼盘名称进行去重处理（使用LinkedHashSet保持顺序）
                Set<String> uniqueProperties = new LinkedHashSet<>(contact.getReceiveProperties());

                // 建立联系人与楼盘分类的关联关系
                uniqueProperties.forEach(propertyName -> {
                    // 查询楼盘名称对应的分类ID
                    Long categoryId = mapper.selectCategoryIdByName(propertyName);
                    if (categoryId != null) {
                        // 插入关联关系（联系人ID -> 楼盘分类ID）
                        mapper.insertContactProperty(contactId, categoryId);
                    } else {
                        // 记录日志：未找到对应的楼盘分类，跳过关联（实际项目中可添加更完善的日志）
                        System.out.println("警告：未找到楼盘分类名称 [" + propertyName + "] 对应的分类ID，联系人ID：" + contactId);
                    }
                });
            }
        }
    }
}